#include <proxy/proxy.h>

#include <format>
#include <iostream>
#include <string>

void basic_usage_example()
{
    using namespace pro;

    // 定义一个格式化的 facade
    struct Formattable : facade_builder ::add_skill<skills::format>::build
    {
    };

    // 示例 1: 使用原始指针
    std::string str = "Hello Proxy!";
    proxy<Formattable> p1 = &str;
    std::cout << std::format("p1: {}\n", *p1);

    // 示例 2: 使用 unique_ptr (拥有所有权)
    proxy<Formattable> p2 = std::make_unique<int>(42);
    std::cout << std::format("p2: {}\n", *p2);

    // 示例 3: 使用 make_proxy (自动选择最优存储)
    proxy<Formattable> p3 = make_proxy<Formattable>(3.14159);
    std::cout << std::format("p3: {:.2f}\n", *p3);

    // 示例 4: 检查代理是否有效
    std::cout << std::format("p1 has value: {}\n", p1.has_value());
    std::cout << std::format("p1 is not null: {}\n", static_cast<bool>(p1));

    // 示例 5: 重置代理
    p1.reset();
    std::cout << std::format("After reset, p1 has value: {}\n", p1.has_value());
}